home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1992 June: ROMin Holiday / ADC Developer CD (1992-06) (''ROMin Holiday'')_iso / Developer Connection - 06-1992.iso / Development Platforms / Apple II / Apple II Sample Code / MPW IIGS SC / SC.021.Dynamo / rt.a < prev    next >
Encoding:
Text File  |  1990-06-24  |  20.5 KB  |  1,543 lines  |  [TEXT/MPS ]

  1. *******************************************************
  2. *                        *
  3. * DYNAMO                        *
  4. *                        *
  5. * Apple II 8-bit runtime library routines.        *
  6. * Copyright (C) 1990 Apple Computer.        *
  7. * Version 3.1                    *
  8. *                        *
  9. * Written by Eric Soldan, Apple II DTS        *
  10. *                                                     *
  11. * Developer Technical Support Apple II Sample Code    *
  12. *                                                     *
  13. *******************************************************
  14.  
  15.         include    ':dynamo.includes:sys.equ'
  16.         import    varspace
  17.  
  18. ******************
  19.  
  20.         export    rtreset
  21. rtreset        proc
  22.         export    numtocopy, chrhibiton, chrhibitoff
  23.         export    sign, readendchr, hexpadchr, padhex
  24.         ldy    #255
  25.         sty    numtocopy
  26.         sty    chrhibitoff
  27.         iny
  28.         sty    chrhibiton
  29.         sty    sign
  30.         sty    readendchr
  31.         lda    #'0'
  32.         sta    hexpadchr
  33.         lsr    padhex
  34.         rts
  35. numtocopy    dc.b    255        ;Will be set back to 255 after
  36.                     ;every string copy or append.
  37. chrhibitoff    dc.b    $FF
  38. chrhibiton    dc.b    0
  39. sign        dc.b    0
  40. readendchr    dc.b    0
  41. hexpadchr    dc.b    '0'
  42. padhex        dc.b    0
  43.         endp
  44.  
  45. ***
  46.  
  47.         export    hibitchrs
  48. hibitchrs    PROC
  49.  
  50.         lda    #$80        ;We don't need to set chrhibitoff
  51.         sta    chrhibiton    ;because it will either be a $7F
  52.         rts            ;or $FF, and in either case
  53.         endp            ;chrhibiton will turn it on anyway.
  54.  
  55. ***
  56.  
  57.         export    lowbitchrs
  58. lowbitchrs    PROC
  59.  
  60.         asl    chrhibiton    ;Was a $00 or $80, so this makes it $00.
  61.         lda    #$7F
  62.         sta    chrhibitoff
  63.         rts
  64.         endp
  65.  
  66. ***
  67.  
  68.         export    regchrs
  69. regchrs        PROC
  70.  
  71.         asl    chrhibiton
  72.         lda    #$FF
  73.         sta    chrhibitoff
  74.         rts
  75.         endp
  76.  
  77. ***
  78.  
  79.         export    rtcout
  80. rtcout        proc
  81.  
  82.         stx    @keepx
  83.         and    chrhibitoff
  84.         ora    chrhibiton
  85.         jsr    $FDED
  86.         ldx    @keepx
  87.         rts
  88. @keepx        dc.b    0
  89.         endp
  90.  
  91. ***
  92.  
  93.         export    write
  94. write        proc
  95.         pla
  96.         sta    @getchr+1
  97.         pla
  98.         sta    @getchr+2
  99.         txa
  100.         pha
  101. @loop        inc    @getchr+1
  102.         bne    @getchr
  103.         inc    @getchr+2
  104. @getchr        lda    $2000        ;Address modified.
  105.         beq    @exit
  106.         jsr    rtcout
  107.         jmp    @loop
  108. @exit        pla
  109.         tax
  110.         lda    @getchr+2
  111.         pha
  112.         lda    @getchr+1
  113.         pha
  114.         rts
  115.         endp
  116.  
  117. ***
  118.  
  119.         export    writecr
  120. writecr        proc
  121.         txa
  122.         pha
  123.         lda    #13
  124.         jsr    rtcout
  125.         pla
  126.         tax
  127.         rts
  128.         endp
  129.  
  130. ***
  131.  
  132.         export    wrcstr
  133. wrcstr        proc
  134.         sta    @getchr+1
  135.         sty    @getchr+2
  136.         txa
  137.         pha
  138. @getchr        lda    $2000        ;Address modified.        
  139.         beq    @exit
  140.         jsr    rtcout
  141.         inc    @getchr+1
  142.         bne    @getchr
  143.         inc    @getchr+2
  144.         bne    @getchr        ;Always.
  145. @exit        pla
  146.         tax
  147.         rts
  148.         endp
  149.  
  150. ***
  151. ***
  152. ***
  153.  
  154.         export    signed
  155. signed        proc
  156.         sec
  157.         ror    sign
  158.         rts
  159.         endp
  160.  
  161. ***
  162.  
  163.         export    unsigned
  164. unsigned        proc
  165.         lsr    sign
  166.         rts
  167.         endp
  168.  
  169. ***
  170.  
  171.         export    chngsgn
  172. chngsgn        proc
  173.         lda    varspace,x
  174.         eor    #$FF
  175.         clc
  176.         adc    #1
  177.         sta    varspace,x
  178.         pha
  179.         lda    varspace+1,x
  180.         eor    #$FF
  181.         adc    #0
  182.         sta    varspace+1,x
  183.         tay
  184.         pla
  185.         rts
  186.         endp
  187.  
  188. ***
  189.  
  190.         export    decoutl
  191. decoutl        proc
  192.         import    decout
  193.         ldy    #0
  194.         jmp    decout        ;jmp, instead of beq so we can be a lib.
  195.         endp
  196.  
  197. ***
  198.  
  199.         export    vdecout
  200. vdecout        proc
  201.         export    decout
  202.         lda    varspace+1,x
  203.         tay
  204.         lda    varspace,x
  205.  
  206. decout        sta    @templ
  207.         sty    @temph
  208.         lda    #'0'
  209.         sta    @temp2
  210.         txa
  211.         pha
  212.         bit    sign
  213.         bpl    @pos
  214.         tya
  215.         bpl    @pos
  216.         lda    #'-'
  217.         jsr    rtcout
  218.         lda    @templ
  219.         eor    #$FF
  220.         clc
  221.         adc    #1
  222.         sta    @templ
  223.         lda    @temph
  224.         eor    #$FF
  225.         adc    #0
  226.         sta    @temph
  227. @pos        ldx    #4
  228. @a        lda    #'0'
  229.         sta    @temp
  230. @b        lda    @templ
  231.         sec
  232.         sbc    @decl,x
  233.         tay
  234.         lda    @temph
  235.         sbc    @dech,x
  236.         bcc    @c
  237.         sta    @temph
  238.         sty    @templ
  239.         inc    @temp
  240.         bcs    @b
  241. @c        lda    @temp
  242.         dex
  243.         bmi    @e        ;Last digit -- print no matter what.
  244.         cmp    @temp2
  245.         beq    @a        ;Don't print leading 0's.
  246.         lsr    @temp2        ;Inval leading 0 test.
  247.         jsr    rtcout
  248.         jmp    @a
  249. @e        jsr    rtcout
  250.         pla
  251.         tax
  252.         rts
  253. @decl        dc.b    1
  254.         dc.b    10
  255.         dc.b    100
  256.         dc.b    1000-768
  257.         dc.b    10000-9984
  258. @dech        dc.b    1>>8
  259.         dc.b    10>>8
  260.         dc.b    100>>8
  261.         dc.b    1000>>8
  262.         dc.b    10000>>8
  263. @templ        dc.b    0
  264. @temph        dc.b    0
  265. @temp        dc.b    0
  266. @temp2        dc.b    0
  267.         endp
  268.  
  269. ***
  270.  
  271.         export    hexpad
  272. hexpad        proc
  273.         sta    hexpadchr
  274.         lsr    padhex
  275.         rts
  276.         endp
  277.  
  278. ***
  279.  
  280.         export    hexnopad
  281. hexnopad        proc
  282.         sec
  283.         ror    padhex
  284.         rts
  285.         endp
  286.  
  287. ***
  288.  
  289.         export    hexoutl
  290. hexoutl        proc
  291.         import    hexout
  292.         ldy    #0
  293.         clc
  294.         jmp    hexout+1        ;jmp, instead of beq so we can be a lib.
  295.         endp
  296.  
  297. ***
  298.  
  299.         export    vhexout
  300. vhexout        proc
  301.         export    hexout
  302.         import    hexpadchr
  303.         lda    varspace+1,x
  304.         tay
  305.         lda    varspace,x
  306.  
  307. hexout        sec
  308.         sta    @templ
  309.         txa
  310.         pha
  311.         ldx    #3
  312.         bcs    @aa
  313.         ldx    #1
  314.         ldy    @templ
  315. @aa        sty    @temph
  316.         lda    padhex
  317.         sta    @padhex
  318.         lda    hexpadchr
  319.         sta    @hexpadchr
  320. @loop        lda    #0
  321.         ldy    #4
  322. @a        asl    @templ
  323.         rol    @temph
  324.         rol    a
  325.         dey
  326.         bne    @a
  327.         tay
  328.         bne    @b
  329.         lda    @padhex
  330.         bmi    @nopad
  331.         lda    @hexpadchr
  332.         jsr    rtcout
  333.         jmp    @nopad
  334. @b        jsr    @doone
  335.         lsr    @padhex
  336.         lda    #'0'
  337.         sta    @hexpadchr
  338. @nopad        dex
  339.         bne    @loop
  340.         lda    @temph
  341.         lsr    a
  342.         lsr    a
  343.         lsr    a
  344.         lsr    a
  345.         tay
  346.         pla
  347.         tax
  348. @doone        lda    @hexdigit,y
  349.         jmp    rtcout
  350. @hexdigit    dc.b    '0123456789ABCDEF'
  351. @padhex        dc.b    0
  352. @hexpadchr    dc.b    0
  353. @templ        dc.b    0
  354. @temph        dc.b    0
  355.         endp
  356.  
  357. ***
  358.  
  359.         export    ldyvar
  360. ldyvar        proc
  361.         lda    varspace,y
  362.         pha
  363.         lda    varspace+1,y
  364.         tay
  365.         pla
  366.         rts
  367.         endp
  368.  
  369. ***
  370.  
  371.         export    mulconl
  372. mulconl        proc
  373.         import    mulcon
  374.         ldy    #0
  375.         jmp    mulcon        ;jmp, instead of beq so we can be a lib.
  376.         endp
  377.  
  378. ***
  379.  
  380.         export    mulvar
  381. mulvar        proc
  382.         export    mulcon, mulvall, mulvalh
  383.         import    multiply, setcon
  384.         jsr    ldyvar
  385.  
  386. mulcon        pha
  387.         lda    varspace,x
  388.         sta    mulvall
  389.         lda    varspace+1,x
  390.         sta    mulvalh
  391.         pla
  392.         jsr    multiply
  393.         jmp    setcon
  394. mulvall        dc.b    0
  395. mulvalh        dc.b    0
  396.         endp
  397.  
  398.         export    multiply
  399. multiply        proc
  400.         sta    @templ
  401.         sty    @temph
  402.         lda    #0
  403.         tay
  404. @a        lsr    mulvalh
  405.         ror    mulvall
  406.         bcc    @b
  407.         clc
  408.         adc    @templ
  409.         pha
  410.         tya
  411.         adc    @temph
  412.         tay
  413.         pla
  414. @b        asl    @templ
  415.         rol    @temph
  416.         pha
  417.         lda    mulvalh
  418.         ora    mulvall
  419.         cmp    #1
  420.         pla
  421.         bcs    @a
  422.         rts
  423. @templ        dc.b    0
  424. @temph        dc.b    0
  425.         endp
  426.  
  427.         export    divconl
  428. divconl        proc
  429.         import    divcon
  430.         ldy    #0
  431.         jmp    divcon        ;jmp, instead of beq so we can be a lib.
  432.         endp
  433.  
  434. ***
  435.  
  436.         export    divvar
  437. divvar        proc
  438.         export    divcon
  439.         import    ldyvar
  440.         jsr    ldyvar
  441.  
  442. divcon        sta    @templ
  443.         sty    @temph
  444.         lda    #16
  445.         sta    @temp
  446.         lda    #0
  447.         sta    @temp2
  448.         sta    @temp3
  449. @a        asl    varspace,x
  450.         rol    varspace+1,x
  451.         rol    @temp2
  452.         rol    @temp3
  453.         lda    @temp2
  454.         sec
  455.         sbc    @templ
  456.         sta    @temp4
  457.         lda    @temp3
  458.         sbc    @temph
  459.         bcc    @b
  460.         sta    @temp3
  461.         lda    @temp4
  462.         sta    @temp2
  463.         inc    varspace,x
  464. @b        dec    @temp
  465.         bne    @a
  466.         lda    @temp2
  467.         ldy    @temp3
  468.         rts
  469. @templ        dc.b    0
  470. @temph        dc.b    0
  471. @temp        dc.b    0
  472. @temp2        dc.b    0
  473. @temp3        dc.b    0
  474. @temp4        dc.b    0
  475.         endp
  476.  
  477. ***
  478.  
  479.         export    addvar
  480. addvar        proc
  481.         export    addcon
  482.         import    ldyvar
  483.         jsr    ldyvar
  484.  
  485. addcon        pha
  486.         clc
  487.         adc    varspace,x
  488.         sta    varspace,x
  489.         tya
  490.         adc    varspace+1,x
  491.         sta    varspace+1,x
  492.         pla
  493.         rts
  494.         endp
  495.  
  496. ***
  497.  
  498.         export    addconl
  499. addconl        proc
  500.         ldy    #0
  501.         jmp    addcon        ;jmp, instead of beq so we can be a lib.
  502.         endp
  503.  
  504. ***
  505.  
  506.         export    subvar
  507. subvar        proc
  508.         export    subcon
  509.         import    ldyvar
  510.         jsr    ldyvar
  511.  
  512. subcon        pha
  513.         sta    @temp
  514.         lda    varspace,x
  515.         sec
  516.         sbc    @temp
  517.         sta    varspace,x
  518.         sty    @temp
  519.         lda    varspace+1,x
  520.         sbc    @temp
  521.         sta    varspace+1,x
  522.         pla
  523.         rts
  524. @temp        dc.b    0
  525.         endp
  526.  
  527. ***
  528.  
  529.         export    subconl
  530. subconl        proc
  531.         ldy    #0
  532.         jmp    subcon        ;jmp, instead of beq so we can be a lib.
  533.         endp
  534.  
  535. ***
  536.  
  537.         export    setconl
  538. setconl        proc
  539.         export    setcon
  540.         ldy    #0
  541.  
  542. setcon        sta    varspace,x
  543.         pha
  544.         tya
  545.         sta    varspace+1,x
  546.         pla
  547.         rts
  548.         endp
  549.  
  550. ***
  551.  
  552.         export    setzero
  553. setzero        proc
  554.         lda    #0
  555.         sta    varspace+1,x
  556.         sta    varspace,x
  557.         rts
  558.         endp
  559.  
  560. ***
  561.  
  562.         export    seteq
  563. seteq        proc
  564.         lda    varspace+1,y
  565.         sta    varspace+1,x
  566.         lda    varspace,y
  567.         sta    varspace,x
  568.         rts
  569.         endp
  570.  
  571. ***
  572.  
  573.         export    setvars
  574. setvars        proc
  575.         pla
  576.         sta    @getval+1
  577.         pla
  578.         sta    @getval+2
  579.         txa
  580.         pha
  581.         ldy    #1
  582. @loop        jsr    @getval
  583.         cmp    #255
  584.         beq    @exit
  585.         tax
  586.         jsr    @getval
  587.         sta    varspace,x
  588.         jsr    @getval
  589.         sta    varspace+1,x
  590.         bcc    @loop        ;Always.
  591. @exit        pla
  592.         tax
  593.         lda    @getval+2
  594.         pha
  595.         lda    @getval+1
  596.         pha
  597.         rts
  598. @getval        lda    $2000,y        ;Address modified.
  599.         inc    @getval+1
  600.         bne    @rts
  601.         inc    @getval+2
  602. @rts        rts
  603.         endp
  604.  
  605. ***
  606.  
  607.         export    xgty
  608. xgty        proc
  609.         import    vifequal, vifsgneq, xlty0
  610.         lda    sign
  611.         bpl    @a
  612.         jsr    vifsgneq
  613.         jmp    @b
  614. @a        jsr    vifequal
  615. @b        bcs    @rts
  616.         jmp    xlty0        ;jmp, instead of bcc so we can be a lib.
  617. @rts        rts
  618.         endp
  619.  
  620. ***
  621.  
  622.         export    xlty
  623. xlty        proc
  624.         export    xlty0
  625.         import    vifequal, vifsgneq
  626.         lda    sign
  627.         bpl    @a
  628.         jsr    vifsgneq
  629.         jmp    @b
  630. @a        jsr    vifequal
  631. @b        bcc    xltyrts
  632. xlty0        lda    varspace,x
  633.         pha
  634.         lda    varspace,y
  635.         sta    varspace,x
  636.         pla
  637.         sta    varspace,y
  638.         lda    varspace+1,x
  639.         pha
  640.         lda    varspace+1,y
  641.         sta    varspace+1,x
  642.         pla
  643.         sta    varspace+1,y
  644. xltyrts        rts
  645.         endp
  646.  
  647. ***
  648.  
  649.         export    ifequal
  650. ifequal        proc
  651.         sta    @lo+1
  652.         sty    @hi+1
  653.         lda    varspace+1,x
  654. @hi        cmp    #0        ;Operand modified.
  655.         bne    @exit
  656.         lda    varspace,x
  657. @lo        cmp    #0        ;Operand modified.
  658. @exit        php
  659.         lda    @lo+1
  660.         plp
  661.         rts            ;eq=eq, cs>=, cc<
  662.         endp
  663.  
  664. ***
  665.  
  666.         export    vifequal
  667. vifequal        proc
  668.         sta    @acc+1
  669.         lda    varspace+1,x
  670.         cmp    varspace+1,y
  671.         bne    @exit
  672.         lda    varspace,x
  673.         cmp    varspace,y
  674. @exit        php
  675. @acc        lda    #0        ;Operand modified.
  676.         plp
  677.         rts
  678.         endp
  679.  
  680. ***
  681.  
  682.         export    ifsgneq
  683. ifsgneq        proc
  684.         sta    @acc+1        ;Preserve acc.
  685.         tya
  686.         cmp    #$80        ;Carry set if right side negative.
  687.         eor    varspace+1,x        ;See if signs are the same.
  688.         bmi    @exit        ;Signs are different -- done.
  689.         bcs    @a        ;Variables are negative.
  690.         lda    @acc+1
  691.         jmp    ifequal        ;Variables are positive.
  692. @a        jsr    ifequal
  693.         beq    @rts        ;xreg variable is equal.
  694.         ror    a
  695.         eor    #$80
  696.         sec            ;not equal status.
  697.         rol    a
  698. @exit        php
  699. @acc        lda    #0        ;Operand modified.
  700.         plp
  701. @rts        rts            ;eq=eq, cs>=, cc<
  702.         endp
  703.  
  704. ***
  705.  
  706.         export    vifsgneq
  707. vifsgneq        proc
  708.         sta    @acc+1
  709.         sty    @yreg+1
  710.         lda    varspace,y        ;Load up the variable value and go do it.
  711.         pha
  712.         lda    varspace+1,y
  713.         tay
  714.         pla
  715.         jsr    ifsgneq
  716.         php
  717. @acc        lda    #0        ;Operand modified.
  718. @yreg        ldy    #0        ;Operand modified.
  719.         plp
  720.         rts
  721.         endp
  722.  
  723. ***
  724.  
  725.         export    seedrandom
  726. seedrandom    proc
  727.         export    randomval
  728.         adc    $C02E        ;Video counter.
  729.         pha
  730.         tya
  731.         adc    $C02E
  732.         tay
  733.         bne    @a
  734.         iny
  735. @a        pla
  736.         bne    @b
  737.         adc    #1
  738. @b        sta    randomval
  739.         sty    randomval+1
  740.         rts
  741. randomval    dc.w    0
  742.         endp
  743.  
  744. ***
  745.  
  746.         export    calcrandom
  747. calcrandom    proc
  748.         stx    @keepx        ;Keep this so we can restore the xreg.
  749.  
  750.         tax            ;Use 1 less than limit, so that we can
  751.         bne    @a        ;compute the smallest mask possible.  This
  752.         dey            ;way, if we are passed $100, we won't
  753. @a        dex            ;compute a mask of $1FF.
  754.         stx    @rndlimit    ;The carry was set by cmp #0, so the 
  755.         sty    @rndlimit+1    ;sbc #1 is okay.
  756.  
  757. * Figure a mask that is larger than or equal to the rndlimit (minus 1).  This will be
  758. * used against the calculated randomval before it is compared to the rndlimit.  If the
  759. * randomval is still too large, then we will get another.
  760.         ldx    #0
  761.         lda    @rndlimit+1
  762.         beq    @c        ;No hi-byte, so work on low-byte.
  763.         txa
  764.         inx
  765. @c        sec
  766.         rol    a
  767.         cmp    @rndlimit,x
  768.         bcc    @c
  769.         sta    @maskl,x
  770.         txa
  771.         eor    #1
  772.         tax
  773.         sbc    #1        ;Carry set.
  774.         sta    @maskl,x
  775.  
  776. @recalc        ldy    #19
  777. @d        asl    randomval
  778.         rol    randomval+1
  779.         bcc    @e
  780.         lda    randomval
  781.         eor    #$87
  782.         sta    randomval
  783.         lda    randomval+1
  784.         eor    #$1D
  785.         sta    randomval+1
  786. @e        dey
  787.         bne    @d
  788.  
  789.         ldy    randomval+1
  790.         ldx    randomval
  791.         bne    @f
  792.         dey
  793. @f        dex
  794.         tya
  795.         and    @maskh
  796.         tay
  797.         txa
  798.         and    @maskl
  799.         cpy    @rndlimit+1
  800.         bcc    @g
  801.         bne    @recalc
  802.         cmp    @rndlimit
  803.         bcc    @g
  804.         bne    @recalc
  805. @g        ldx    @keepx
  806.         rts
  807. @rndlimit    dc.w    0
  808. @keepx        dc.b    0
  809. @maskl        dc.b    0
  810. @maskh        dc.b    0
  811.         endp
  812.  
  813. ***
  814. ***
  815. ***
  816.  
  817.         export    strval
  818. strval        proc
  819.         export    midstrval
  820.         import    strinfo, strsign, strvalcount, strvaldigit, strlen, currentstr, nextchr
  821.         ldy    #0
  822. midstrval    jsr    strinfo
  823.         sta    @getchr+1
  824.         stx    @getchr+2
  825.         lda    #0
  826.         sta    strsign
  827.         sta    strvalcount
  828.         sta    strvaldigit
  829.         sta    @temp
  830.         sta    @temp2
  831. @sign        cpy    strlen
  832.         bcs    @exit        ;Indexed out of string at start.
  833.         jsr    @getchr        ;Decimal or hex...
  834.         cmp    #'-'        ;Find out if there is an even or odd # of -'s.
  835.         bne    @pos
  836.         inc    strsign
  837.         iny
  838.         inc    strvalcount
  839.         bcs    @sign        ;Always.
  840. @pos        cmp    #'$'
  841.         beq    @hex
  842. @a        cmp    #'0'
  843.         bcc    @exit        ;Not an int char, so we are done.
  844.         cmp    #'9'+1
  845.         bcs    @exit        ;Not an int char, so we are done.
  846.         iny
  847.         inc    strvalcount
  848.         inc    strvaldigit
  849.         sbc    #47        ;cclear
  850.         pha
  851.         ldx    @temp2        ;Multiply by 10.
  852.         lda    @temp
  853.         asl    a
  854.         rol    @temp2
  855.         asl    a
  856.         rol    @temp2
  857.         adc    @temp
  858.         sta    @temp
  859.         txa
  860.         adc    @temp2
  861.         asl    @temp
  862.         rol    a
  863.         sta    @temp2
  864.         pla
  865.         adc    @temp
  866.         sta    @temp
  867.         bcc    @b
  868.         inc    @temp2
  869. @b        cpy    strlen        ;See if we have more characters to look at.
  870.         bcs    @exit        ;No more characters to look at.
  871.         jsr    @getchr        ;Get the next character.
  872.         bcc    @a        ;Always.
  873. @exit        sty    nextchr        ;Save next character location.
  874.         ldx    currentstr
  875.         lda    @temp        ;Return value in acc,yreg.
  876.         ldy    @temp2
  877.         ror    strsign        ;Should be negative.
  878.         bcc    @rts
  879.         eor    #$FF
  880.         adc    #0        ;cset
  881.         pha
  882.         tya
  883.         eor    #$FF
  884.         adc    #0
  885.         tay
  886.         pla
  887. @rts        rts
  888. @getchr        lda    $2000,y        ;Address modified.
  889.         rts
  890. @hex        iny
  891.         inc    strvalcount
  892.         cpy    strlen
  893.         bcs    @exit
  894.         jsr    @getchr
  895.         cmp    #'0'
  896.         bcc    @exit
  897.         cmp    #'9'+1
  898.         bcc    @hexdigit
  899.         and    #$5F
  900.         cmp    #'A'
  901.         bcc    @exit
  902.         cmp    #'Z'+1
  903.         bcs    @exit
  904.         sbc    #6        ;Carry clear.
  905. @hexdigit    inc    strvaldigit
  906.         asl    @temp
  907.         rol    @temp2
  908.         asl    @temp
  909.         rol    @temp2
  910.         asl    @temp
  911.         rol    @temp2
  912.         asl    @temp
  913.         rol    @temp2
  914.         and    #$0F
  915.         ora    @temp
  916.         sta    @temp
  917.         jmp    @hex
  918. @temp        dc.b    0
  919. @temp2        dc.b    0
  920.         endp
  921.  
  922. ***
  923.  
  924.  
  925.         export    strinfo
  926. strinfo        proc
  927.         export    currentstr, strlen, maxstrlen, numchrs
  928.         export    strsign, strvalcount, strvaldigit, nextchr
  929.         import    strlens, maxstrlens, strlocs, numtocopy
  930.         stx    currentstr
  931.         lda    strlens,x    ;String number in xreg.
  932.         sta    strlen
  933.         lda    maxstrlens,x
  934.         sta    maxstrlen
  935.         txa
  936.         asl    a
  937.         tax
  938.         bcs    @a
  939.         lda    strlocs,x
  940.         pha
  941.         lda    strlocs+1,x
  942.         tax
  943.         pla
  944.         rts
  945. @a        lda    strlocs+$100,x
  946.         pha
  947.         lda    strlocs+$101,x
  948.         tax
  949.         pla
  950.         rts
  951. currentstr    dc.b    0
  952. strlen        dc.b    0
  953. maxstrlen    dc.b    0
  954. numchrs        dc.b    0
  955. strsign        dc.b    0
  956. strvalcount    dc.b    0
  957. strvaldigit    dc.b    0
  958. nextchr        dc.b    0
  959.         endp
  960.  
  961. ***
  962.  
  963.         export    prstr
  964. prstr        proc
  965.         lda    #255        ;xreg=str -- write entire string.
  966.         export    prleftstr, prmidstr
  967.  
  968. prleftstr    ldy    #0        ;xreg=str, acc=numChrs
  969.  
  970. prmidstr        cmp    #0
  971.         beq    @exit
  972.         sta    numchrs        ;xreg=str, acc=numChrs, yreg=starting chr.
  973.         jsr    strinfo
  974.         sta    @getchr+1
  975.         stx    @getchr+2
  976. @loop        cpy    strlen
  977.         bcs    @exit
  978.         tya
  979.         pha
  980. @getchr        lda    $2000,y        ;Address modified.
  981.         jsr    rtcout
  982.         pla
  983.         tay
  984.         iny
  985.         dec    numchrs
  986.         bne    @loop
  987. @exit        ldx    currentstr
  988.         rts
  989.         endp
  990.  
  991. ***
  992.  
  993.         export    leftstrcpy
  994. leftstrcpy    proc
  995.         export    strcpy, midstrcpy
  996.         import    numtocopy, copystr
  997.         sta    numtocopy    ;Number to copy in acc.
  998.  
  999. strcpy        lda    #0        ;Copy entire string.
  1000.  
  1001. midstrcpy    clc            ;String offset in acc.
  1002.         jmp    copystr        ;jmp, instead of bcc so we can be a lib.
  1003.         endp
  1004.  
  1005. ***
  1006.  
  1007.         export    leftstrcat
  1008. leftstrcat    proc
  1009.         export    strcat, midstrcat, copystr
  1010.         import    strlens, strlocs
  1011.         sta    numtocopy    ;Number to append in acc.
  1012.  
  1013. strcat        lda    #0        ;Append entire string.
  1014.  
  1015. midstrcat    sec            ;String offset in acc.
  1016.  
  1017. copystr        pha            ;Keep source offset.
  1018.         php            ;Keep copy or append status.
  1019.         jsr    strinfo
  1020.         sta    @dst+1
  1021.         stx    @dst+2
  1022.         lda    strlens,y
  1023.         sta    @srcstrlen
  1024.         tya
  1025.         asl    a
  1026.         tay
  1027.         bcs    @a
  1028.         lda    strlocs,y
  1029.         sta    @src+1
  1030.         lda    strlocs+1,y
  1031.         sta    @src+2
  1032.         bcc    @b
  1033. @a        lda    strlocs+$100,y
  1034.         sta    @src+1
  1035.         lda    strlocs+$101,y
  1036.         sta    @src+2
  1037. @b        ldx    #0
  1038.         plp            ;Get copy or append status.
  1039.         bcc    @c        ;Copy status.
  1040.         ldx    strlen        ;Append status.
  1041. @c        pla
  1042.         tay            ;Source offset.
  1043. @loop        cpy    @srcstrlen
  1044.         bcs    @exit
  1045.         cpx    maxstrlen
  1046.         bcs    @exit
  1047. @src        lda    $2000,y        ;Address modified.
  1048. @dst        sta    $2000,x        ;Address modified.
  1049.         inx
  1050.         iny
  1051.         dec    numtocopy
  1052.         bne    @loop
  1053. @exit        lda    #255        ;Set it back for next midstr operation.
  1054.         sta    numtocopy    ;The next one may only have 3 parameters.
  1055.         txa            ;xreg has destination string length.
  1056.         ldx    currentstr
  1057.         sta    strlens,x
  1058.         rts
  1059. @srcstrlen    dc.b    0
  1060.         endp
  1061.  
  1062. ***
  1063.  
  1064.         export    litstr
  1065. litstr        proc
  1066.         import    strlens
  1067.         pla
  1068.         sta    @getchr+1
  1069.         pla
  1070.         sta    @getchr+2
  1071.         jsr    strinfo
  1072.         sta    @putchr+1
  1073.         stx    @putchr+2
  1074.         ldy    #0
  1075. @loop        inc    @getchr+1
  1076.         bne    @getchr
  1077.         inc    @getchr+2
  1078. @getchr        lda    $2000        ;Address modified.
  1079.         beq    @exit
  1080.         cpy    maxstrlen
  1081.         bcs    @loop
  1082. @putchr        sta    $2000,y
  1083.         iny
  1084.         bne    @loop
  1085. @exit        lda    @getchr+2
  1086.         pha
  1087.         lda    @getchr+1
  1088.         pha
  1089.         ldx    currentstr
  1090.         tya
  1091.         sta    strlens,x
  1092.         rts
  1093.         endp
  1094.  
  1095. ***
  1096.  
  1097.         export    strchr
  1098. strchr        proc
  1099.         tay
  1100.         jsr    strinfo
  1101.         sta    @getchr+1
  1102.         stx    @getchr+2
  1103. @getchr        lda    $2000,y
  1104.         ldx    currentstr
  1105.         rts
  1106.         endp
  1107.  
  1108. ***
  1109.  
  1110.         export    strloc
  1111. strloc        proc
  1112.         jsr    strinfo
  1113.         pha
  1114.         txa
  1115.         tay
  1116.         ldx    currentstr
  1117.         pla
  1118.         rts
  1119.         endp
  1120.  
  1121. ***
  1122. ***
  1123. ***
  1124.  
  1125.         export    restore
  1126. restore        proc
  1127.         import    getdatabyte
  1128.         sta    getdatabyte+1
  1129.         sty    getdatabyte+2
  1130.         rts
  1131.         endp
  1132.  
  1133. ***
  1134.  
  1135.         export    getdatabyte
  1136. getdatabyte    proc
  1137.         lda    $2000
  1138.         inc    getdatabyte+1
  1139.         bne    @rts
  1140.         inc    getdatabyte+2
  1141. @rts        rts
  1142.         endp
  1143.  
  1144. ***
  1145.  
  1146.         export    readint
  1147. readint        proc
  1148.         jsr    getdatabyte
  1149.         sta    varspace,x
  1150.         pha
  1151.         jsr    getdatabyte
  1152.         sta    varspace+1,x
  1153.         tay
  1154.         pla
  1155.         rts
  1156.         endp
  1157.  
  1158. ***
  1159.  
  1160.         export    readstr
  1161. readstr        proc
  1162.         import    strlens
  1163.         jsr    strinfo
  1164.         sta    @putchr+1
  1165.         stx    @putchr+2
  1166.         ldy    #0
  1167. @loop        jsr    getdatabyte
  1168.         cmp    readendchr
  1169.         beq    @exit
  1170.         cpy    maxstrlen
  1171.         bcs    @loop
  1172. @putchr        sta    $2000,y
  1173.         iny
  1174.         bne    @loop
  1175. @exit        ldx    currentstr
  1176.         tya
  1177.         sta    strlens,x
  1178.         rts
  1179.         endp
  1180.  
  1181. ***
  1182.  
  1183.         export    readend
  1184. readend        proc
  1185.         sta    readendchr
  1186.         rts
  1187.         endp
  1188.  
  1189. ***
  1190. ***
  1191. ***
  1192.  
  1193.         export    arraybase
  1194. arraybase    proc
  1195.         export    arrayloc1, arrayloc2, arrayloc3
  1196.         export    arrayloc0l, arrayloc0h
  1197.         export    arrayloc1l, arrayloc1h
  1198.         export    arrayloc2l, arrayloc2h
  1199.         export    arrayloc3l, arrayloc3h
  1200.         sta    arrayloc0l
  1201.         sty    arrayloc0h
  1202. arrayloc1    sta    arrayloc1l
  1203.         sty    arrayloc1h
  1204. arrayloc2    sta    arrayloc2l
  1205.         sty    arrayloc2h
  1206. arrayloc3    sta    arrayloc3l
  1207.         sty    arrayloc3h
  1208.         sta    aptr
  1209.         sty    aptr+1
  1210.         rts
  1211. arrayloc0l    dc.b    0
  1212. arrayloc0h    dc.b    0
  1213. arrayloc1l    dc.b    0
  1214. arrayloc1h    dc.b    0
  1215. arrayloc2l    dc.b    0
  1216. arrayloc2h    dc.b    0
  1217. arrayloc3l    dc.b    0
  1218. arrayloc3h    dc.b    0
  1219.         endp
  1220.  
  1221. ***
  1222.  
  1223.         export    dim1size
  1224. dim1size        proc
  1225.         export    dim2size, dim3size
  1226.         export    dim1sizel, dim1sizeh
  1227.         export    dim2sizel, dim2sizeh
  1228.         export    dim3sizel, dim3sizeh
  1229.         sta    dim1sizel
  1230.         sty    dim1sizeh
  1231. dim2size        sta    dim2sizel
  1232.         sty    dim2sizeh
  1233. dim3size        sta    dim3sizel
  1234.         sty    dim3sizeh
  1235.         rts
  1236. dim1sizel    dc.b    0
  1237. dim1sizeh    dc.b    0
  1238. dim2sizel    dc.b    0
  1239. dim2sizeh    dc.b    0
  1240. dim3sizel    dc.b    0
  1241. dim3sizeh    dc.b    0
  1242.         endp
  1243.  
  1244. ***
  1245.  
  1246.         export    varyindx1
  1247. varyindx1    proc
  1248.         export    arrayindx1, arraylindx1
  1249.         lda    varspace,y
  1250.         pha
  1251.         lda    varspace+1,y
  1252.         tay
  1253.         pla
  1254.  
  1255. arrayindx1    sta    mulvall
  1256.         sty    mulvalh
  1257.         lda    dim1sizel
  1258.         ldy    dim1sizeh
  1259.         jsr    multiply
  1260.         clc
  1261.         adc    arrayloc0l
  1262.         pha
  1263.         tya
  1264.         adc    arrayloc0h
  1265.         tay
  1266.         pla
  1267.         jmp    arrayloc1
  1268. arraylindx1    ldy    #0        ;Low-byte-only index entry point.
  1269.         beq    arrayindx1
  1270.         endp
  1271.  
  1272. ***
  1273.  
  1274.         export    varyindx2
  1275. varyindx2    proc
  1276.         export    arrayindx2, arraylindx2
  1277.         lda    varspace,y
  1278.         pha
  1279.         lda    varspace+1,y
  1280.         tay
  1281.         pla
  1282.  
  1283. arrayindx2    sta    mulvall
  1284.         sty    mulvalh
  1285.         lda    dim2sizel
  1286.         ldy    dim2sizeh
  1287.         jsr    multiply
  1288.         clc
  1289.         adc    arrayloc1l
  1290.         pha
  1291.         tya
  1292.         adc    arrayloc1h
  1293.         tay
  1294.         pla
  1295.         jmp    arrayloc2
  1296. arraylindx2    ldy    #0        ;Low-byte-only index entry point.
  1297.         beq    arrayindx2
  1298.         endp
  1299.  
  1300. ***
  1301.  
  1302.         export    varyindx3
  1303. varyindx3    proc
  1304.         export    arrayindx3, arraylindx3
  1305.         lda    varspace,y
  1306.         pha
  1307.         lda    varspace+1,y
  1308.         tay
  1309.         pla
  1310.  
  1311. arrayindx3    sta    mulvall
  1312.         sty    mulvalh
  1313.         lda    dim3sizel
  1314.         ldy    dim3sizeh
  1315.         jsr    multiply
  1316.         clc
  1317.         adc    arrayloc2l
  1318.         pha
  1319.         tya
  1320.         adc    arrayloc2h
  1321.         tay
  1322.         pla
  1323.         jmp    arrayloc3
  1324. arraylindx3    ldy    #0        ;Low-byte-only index entry point.
  1325.         beq    arrayindx3
  1326.         endp
  1327.  
  1328. ***
  1329.  
  1330.         export    vgetbyte
  1331. vgetbyte        proc
  1332.         export    getbyte, getnextbyte, getbytel
  1333.         lda    varspace,y
  1334.         pha
  1335.         lda    varspace+1,y
  1336.         tay
  1337.         pla
  1338.  
  1339. getbyte        clc
  1340.         adc    arrayloc3l
  1341.         sta    aptr
  1342.         tya
  1343.         adc    arrayloc3h
  1344.         sta    aptr+1
  1345. getnextbyte    ldy    #0
  1346.         tya
  1347.         sta    varspace+1,x
  1348.         lda    (aptr),y
  1349.         sta    varspace,x
  1350.         inc    aptr
  1351.         bne    @a
  1352.         inc    aptr+1
  1353. @a        rts
  1354. getbytel        ldy    #0
  1355.         beq    getbyte
  1356.         endp
  1357.  
  1358. ***
  1359.  
  1360.         export    vgetword
  1361. vgetword        proc
  1362.         export    getword, getnextword, getwordl
  1363.         lda    varspace,y
  1364.         pha
  1365.         lda    varspace+1,y
  1366.         tay
  1367.         pla
  1368.  
  1369. getword        asl    a
  1370.         bcc    @a
  1371.         iny
  1372. @a        clc
  1373.         adc    arrayloc3l
  1374.         sta    aptr
  1375.         tya
  1376.         adc    arrayloc3h
  1377.         sta    aptr+1
  1378. getnextword    ldy    #0
  1379.         lda    (aptr),y
  1380.         sta    varspace,x
  1381.         inc    aptr
  1382.         bne    @b
  1383.         inc    aptr+1
  1384. @b        lda    (aptr),y
  1385.         sta    varspace+1,x
  1386.         inc    aptr
  1387.         bne    @c
  1388.         inc    aptr+1
  1389. @c        tay
  1390.         lda    varspace,x
  1391.         rts
  1392. getwordl        ldy    #0
  1393.         beq    getword
  1394.         endp
  1395.  
  1396. ***
  1397.  
  1398.         export    vputbyte
  1399. vputbyte        proc
  1400.         export    putbyte, putnextbyte, putbytel
  1401.         lda    varspace,y
  1402.         pha
  1403.         lda    varspace+1,y
  1404.         tay
  1405.         pla
  1406.  
  1407. putbyte        clc
  1408.         adc    arrayloc3l
  1409.         sta    aptr
  1410.         tya
  1411.         adc    arrayloc3h
  1412.         sta    aptr+1
  1413. putnextbyte    lda    varspace,x
  1414.         ldy    #0
  1415.         sta    (aptr),y
  1416.         inc    aptr
  1417.         bne    @a
  1418.         inc    aptr+1
  1419. @a        rts
  1420. putbytel        ldy    #0
  1421.         beq    putbyte
  1422.         endp
  1423.  
  1424. ***
  1425.  
  1426.         export    vputword
  1427. vputword        proc
  1428.         export    putword, putnextword, putwordl
  1429.         lda    varspace,y
  1430.         pha
  1431.         lda    varspace+1,y
  1432.         tay
  1433.         pla
  1434.  
  1435. putword        asl    a
  1436.         bcc    @a
  1437.         iny
  1438. @a        clc
  1439.         adc    arrayloc3l
  1440.         sta    aptr
  1441.         tya
  1442.         adc    arrayloc3h
  1443.         sta    aptr+1
  1444. putnextword    ldy    #0
  1445.         lda    varspace,x
  1446.         sta    (aptr),y
  1447.         inc    aptr
  1448.         bne    @b
  1449.         inc    aptr+1
  1450. @b        lda    varspace+1,x
  1451.         sta    (aptr),y
  1452.         inc    aptr
  1453.         bne    @c
  1454.         inc    aptr+1
  1455. @c        tay
  1456.         lda    varspace,x
  1457.         rts
  1458. putwordl        ldy    #0
  1459.         beq    putword
  1460.         endp
  1461.  
  1462. ***
  1463.  
  1464.         export    deref
  1465. deref        PROC
  1466.         sta    @getbyte+1
  1467.         sty    @getbyte+2
  1468.         jsr    @getbyte        ;Get low-byte.
  1469.         tya
  1470.         inc    @getbyte+1
  1471.         bne    @getbyte
  1472.         inc    @getbyte+2
  1473. @getbyte        ldy    $2000        ;Address modified.        
  1474.         rts
  1475.  
  1476.         endp
  1477.  
  1478. ***
  1479.  
  1480.         export    aderefz
  1481. aderefz        PROC
  1482.         export    aderef
  1483.         lda    $2000        ;Address modified.
  1484.         inc    aderefz+1
  1485.         bne    @rts
  1486.         inc    aderefz+2
  1487. @rts        rts
  1488. aderef        sta    aderefz+1
  1489.         jsr    aderefz        ;Get low-byte.
  1490.         pha
  1491.         jsr    aderefz
  1492.         sta    aderefz+2
  1493.         pla
  1494.         rts
  1495.  
  1496.         endp
  1497.  
  1498. ***
  1499.  
  1500.         export    yderefz
  1501. yderefz        PROC
  1502.         export    yderef
  1503.         ldy    $2000        ;Address modified.
  1504.         inc    yderefz+1
  1505.         bne    @rts
  1506.         inc    yderefz+2
  1507. @rts        rts
  1508. yderef        sty    yderefz+1
  1509.         jsr    yderefz        ;Get low-byte.
  1510.         sty    @lo
  1511.         jsr    yderefz
  1512.         sty    yderefz+2
  1513.         ldy    @lo
  1514.         rts
  1515. @lo        dc.b    0
  1516.  
  1517.         endp
  1518.  
  1519. ***
  1520.  
  1521.         export    vderef        ;x-reg variable deref.
  1522. vderef        PROC
  1523.         pha
  1524.         lda    varspace,x
  1525.         sta    @getbyte+1
  1526.         lda    varspace+1,x
  1527.         sta    @getbyte+2
  1528.         jsr    @getbyte        ;Get low-byte.
  1529.         sta    varspace,x
  1530.         inc    @getbyte+1
  1531.         bne    @a
  1532.         inc    @getbyte+2
  1533. @a        jsr    @getbyte
  1534.         sta    varspace+1,x
  1535.         pla
  1536.         rts
  1537. @getbyte        lda    $2000        ;Address modified.        
  1538.         rts
  1539.  
  1540.         endp
  1541.  
  1542.         end
  1543.